<?php
/**
 * 微信用户管理接口
 */
namespace App\Ext\Wechat;

class User
{
    /**
     * 获取用户基本信息（包括UnionID机制）
     * @param string $authToken 调用接口凭证
     * @param string $openID 普通用户的标识，对当前公众号唯一
     * @param string $lang 返回国家地区语言版本，zh_CN 简体，zh_TW 繁体，en 英语
     * @return bool
     * 
     * 正常情况下，微信会返回下述JSON数据包给公众号：
     * 
     * {
     *     "subscribe": 1,
     *     "openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M",
     *     "nickname": "Band",
     *     "sex": 1,
     *     "language": "zh_CN",
     *     "city": "广州",
     *     "province": "广东",
     *     "country": "中国",
     *     "headimgurl":  "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
     *     "subscribe_time": 1382694957,
     *     "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL",
     *     "remark": "",
     *     "groupid": 0,
     *     "tagid_list":[128,2]
     * }
     * 
     * 参数说明
     * 
     * subscribe         用户是否订阅该公众号标识，值为0时，代表此用户没有关注该公众号，拉取不到其余信息。
     * openid            用户的标识，对当前公众号唯一
     * nickname          用户的昵称
     * sex               用户的性别，值为1时是男性，值为2时是女性，值为0时是未知
     * city              用户所在城市
     * country           用户所在国家
     * province          用户所在省份
     * language          用户的语言，简体中文为zh_CN
     * headimgurl        用户头像，最后一个数值代表正方形头像大小（有0、46、64、96、132数值可选，0代表640*640正方形头像），用户没有头像时该项为空。若用户更换头像，原有头像URL将失效。
     * subscribe_time    用户关注时间，为时间戳。如果用户曾多次关注，则取最后关注时间
     * unionid           只有在用户将公众号绑定到微信开放平台帐号后，才会出现该字段。
     * remark            公众号运营者对粉丝的备注，公众号运营者可在微信公众平台用户管理界面对粉丝添加备注
     * groupid           用户所在的分组ID（兼容旧的用户分组接口）
     * tagid_list        用户被打上的标签ID列表
     * 
     * 错误时微信会返回错误码等信息，JSON数据包示例如下（该示例为AppID无效错误）:
     * 
     * {"errcode":40013,"errmsg":"invalid appid"}
     * 
     */
    public static function userInfo($authToken, $openID, $lang = 'zh-CN')
    {
        if (empty($authToken)) die('Wechat.User.userInfo: $authToken is not defined');
        $url = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token=' . $authToken . '&openid=' . $openID . '&lang=' . $lang;
        $callback = Common::get($url);
        $callback = json_decode($callback);
        if (empty($callback->errcode)) {
            return $callback;
        } else {
            die('Wechat.User.userInfo: ' . $callback->errcode . ' - ' . $callback->errmsg);
        }
        return false;
    }

    /**
     * 批量获取用户基本信息
     * 开发者可通过该接口来批量获取用户基本信息。最多支持一次拉取100条。
     * @param $authToken    网页授权 access_token
     * @param $param        用户信息 POST 数据
     * @return bool|mixed
     *
     * POST数据示例
     *
     * {
     *     "user_list": [
     *         {
     *             "openid": "otvxTs4dckWG7imySrJd6jSi0CWE",
     *             "lang": "zh_CN"
     *         },
     *         {
     *             "openid": "otvxTs_JZ6SEiP0imdhpi50fuSZg",
     *             "lang": "zh_CN"
     *         }
     *     ]
     * }
     *
     * 参数说明
     *
     * openid    必填项    用户的标识，对当前公众号唯一
     * lang      非必填    国家地区语言版本，zh_CN 简体，zh_TW 繁体，en 英语，默认为zh-CN
     *
     * 正常情况下，微信会返回下述JSON数据包给公众号（示例中为一次性拉取了2个openid的用户基本信息，第一个是已关注的，第二个是未关注的）：
     *
     * {
     *     "user_info_list": [
     *         {
     *             "subscribe": 1,
     *             "openid": "otvxTs4dckWG7imySrJd6jSi0CWE",
     *             "nickname": "iWithery",
     *             "sex": 1,
     *             "language": "zh_CN",
     *             "city": "揭阳",
     *             "province": "广东",
     *             "country": "中国",
     *             "headimgurl": "http://wx.qlogo.cn/mmopen/xbIQx1GRqdvyqkMMhEaGOX802l1CyqMJNgUzKP8MeAeHFicRDSnZH7FY4XB7p8XHXIf6uJA2SCunTPicGKezDC4saKISzRj3nz/0",
     *             "subscribe_time": 1434093047,
     *             "unionid": "oR5GjjgEhCMJFyzaVZdrxZ2zRRF4",
     *             "remark": "",
     *             "groupid": 0,
     *             "tagid_list":[128,2]
     *         },
     *         {
     *             "subscribe": 0,
     *             "openid": "otvxTs_JZ6SEiP0imdhpi50fuSZg",
     *             "unionid": "oR5GjjjrbqBZbrnPwwmSxFukE41U",
     *         }
     *     ]
     * }
     *
     * 参数说明
     *
     * subscribe         用户是否订阅该公众号标识，值为0时，代表此用户没有关注该公众号，拉取不到其余信息，只有openid和UnionID（在该公众号绑定到了微信开放平台账号时才有）。
     * openid            用户的标识，对当前公众号唯一
     * nickname          用户的昵称
     * sex               用户的性别，值为1时是男性，值为2时是女性，值为0时是未知
     * city              用户所在城市
     * country           用户所在国家
     * province          用户所在省份
     * language          用户的语言，简体中文为zh_CN
     * headimgurl        用户头像，最后一个数值代表正方形头像大小（有0、46、64、96、132数值可选，0代表640*640正方形头像），用户没有头像时该项为空。若用户更换头像，原有头像URL将失效。
     * subscribe_time    用户关注时间，为时间戳。如果用户曾多次关注，则取最后关注时间
     * unionid           只有在用户将公众号绑定到微信开放平台帐号后，才会出现该字段。
     * remark            公众号运营者对粉丝的备注，公众号运营者可在微信公众平台用户管理界面对粉丝添加备注
     * groupid           用户所在的分组ID（暂时兼容用户分组旧接口）
     * tagid_list        用户被打上的标签ID列表
     *
     * 错误时微信会返回错误码等信息，JSON数据包示例如下（该示例为AppID无效错误）:
     *
     * {"errcode":40013,"errmsg":"invalid appid"}
     *
     */
    public static function batchUserInfo($authToken, $param)
    {
        if (empty($authToken)) die('Wechat.User.batchUserInfo: $authToken is not defined');
        if (empty($param)) die('Wechat.User.batchUserInfo: $param is not defined');
        # JSON_UNESCAPED_SLASHES 不要编码 /。 自 PHP 5.4.0 起生效。
        # JSON_UNESCAPED_UNICODE 以字面编码多字节 Unicode 字符（默认是编码成 \uXXXX）。 自 PHP 5.4.0 起生效。
        $param = json_encode($param, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
        $url = 'https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=ACCESS_TOKEN';
        $callback = Common::postJson($url, $param);
        $callback = json_decode($callback);
        if (empty($callback->errcode)) {
            return $callback;
        } else {
            die('Wechat.User.batchUserInfo: ' . $callback->errcode . ' - ' . $callback->errmsg);
        }
        return false;
    }
}